package cn.tedu.search.repository;

import cn.tedu.search.entity.Item;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import org.springframework.stereotype.Repository;

import java.util.List;

//repository是Spring家族对持久层的命名规范
@Repository
//继承 ElasticsearchRepostitory<实现类,实现类中定义的ID属性>,此接口由Spring Data提供的
//继承此接口之后，当前接口就可以直接使用父接口中声明的方法，包含了Item实体类基本的增上改查
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {

    //Spring Data 自定义查询
    //编写一个符合spring data格式的方法名
    //Spring Data会根据我们定义的方法名称推测我们的意图，自动生成能够完成这个意图的查询语句

    //单条件查询
    Iterable<Item> queryItemsByTitleMatches(String title);



    //多条件查询，条件之间使用And分割,参数复制到需要参数的位置是根据顺序依次赋值的和参数名称无关
    List<Item> queryItemsByTitleMatchesAndBrandMatches(String title, String brand);

    //排序查询title OR brand 根据 price 降序排序
    List<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title, String brand);

    //查询
    Page<Item> queryItemsByTitleMatchesOrCategoryMatchesOrderByPriceDesc(String title,String brand,Pageable pageable);

    //实现分页查询,通过返回值和参数进行设置
    //返回值类型 Page<T> , 在参数列表的最后 添加Pageable
    //Page类型的功能，技能保存查询出的当前页数据，又能保存分页信息。
        //分页信息就是本次查询结果中分页相关的数据，如：当前页码，每页页数，总页数，总条数，有没有上一页等信息
    //参数方面，在当前所有已经存在的参数最后添加，pageable参数，在调用时为这个pageable参数赋值要查询的页码和每页条数
    Page<Item> queryItemsByTitleMatchesOrBrandMatchesOrderByPriceDesc(String title, String brand, Pageable pageable);

}
